#include <iostream>
#include <string>
//容器
#include <vector>

/*
API介绍
//构造函数
vector():   //默认构造函数，创建空的vector
vector(size_type count):    //创建指定大小的 vector
vector(size_type count , const T &value ):  //创建指定大小并填充指定值的 vector
vector(const vector &other);        //拷贝构造函数
vector(vector &&other) noexcept:    //移动构造函数

//元素访问
at(size_type pos)		：返回指定位置的元素，有越界检查。
operator[]				：返回指定位置的元素，没有越界检查。
front()					：返回第一个元素。
back()					：返回最后一个元素。
data()					：返回指向容器数据的指针。

//迭代器
begin()		：返回指向容器第一个元素的迭代器。
end()		：返回指向容器末尾之后位置的迭代器。
rbegin()	：返回指向容器最后一个元素的逆向迭代器。
rend()		：返回指向容器第一个元素之前位置的逆向迭代器。
cbegin()	：返回指向容器第一个元素的常量迭代器。
cend()		：返回指向容器末尾之后位置的常量迭代器。
crbegin()	：返回指向容器最后一个元素的常量逆向迭代器。
crend()		：返回指向容器第一个元素之前位置的常量逆向迭代器。
*/

using namespace std;

struct my_stu
{
public:

    string name;
    int id;

    my_stu()
    {

    }

    my_stu(string name , int id)
        : name(name) , id(id)
    {

    }
};

int main(int argc, char const *argv[])
{
    //vector():   默认构造函数，创建空的vector
    vector<int> v1;

    cout << "v1的大小" << v1.size() <<  endl;

    //vector(size_type count , const T &value ):  创建指定大小并填充指定值的 vector
    vector<int> v2(10,50);

    cout << "v2的大小" << v2.size() << "\tv2的值" << v2.at(9) << endl;

    for(size_t i =0; i < 10; i++)
    {
        v2[i] = i;
    }
    
    //front 和 back
    cout << "v2的front值" << v2.front() << endl;
    cout << "v2的back值" << v2.back() << endl;

    for(auto it = v1.begin(); it != v1.end(); ++it)
    {
        cout << *it << endl;
        //*it it是指向内部元素的首地址
    }

    vector<my_stu> v3;

    v3.push_back(my_stu("张三" , 10));
    v3.push_back(my_stu("张四" , 10));
    v3.push_back(my_stu("张五" , 10));
    v3.push_back(my_stu("张六" , 10));
    
    //iterator 迭代器的类型
    for ( vector<my_stu>::iterator it = v3.begin() ; it != v3.end() ; it++)
    {
        cout << (*it).id << endl;
        cout << (*it).name << endl;
    }

    return 0;
}
